gusucode.com > VC 达内MFC例子集源码-源码程序 > VC 达内MFC例子集源码-源码程序/code/20110106/day08.txt
一 映射 CMap 1 CMap的内存构造 HashTable - 哈希表 int <-> CString 1) 3 - "Test1" 2) 1 - "Test2" 3) 0 - "Test3" 4) 2 - "Test4" 5) 6 - "Test5" 6) 7 - "Test6" index = key%4 [0] -> "0, Test3, pNext" [1] -> "1, Test2, pNext" [2] -> "2, Test4, pNext" -> "6, Test5, pNext" ... [3] -> "3, Test1, pNext" -> "7, Test10, pNext" index = key%8 [0] -> "0, Test3, pNext" [1] -> "1, Test2, pNext" [2] -> "2, Test4, pNext" [3] -> "3, Test1, pNext" [4] [5] [6] -> "6, Test5, pNext" [7] -> "7, Test10, pNext" CMap当中,初始化HastTable,需要估算 数据量N, 实际初始化长度M: M = N * 1.2 + 1; 例如: 估算数据量100,HastTable实际 长度 100 * 1.2 + 1 = 121 2 CMap的使用 2.1 数据类的定义 2.1.1 要有默认不带参数的构造函数, 或者参数全部具有默认值. 2.1.2 将 operator= 重载实现. 2.2 CMap的定义 template< class KEY, //KEY的类型 class ARG_KEY, //KEY参数类型 class VALUE, //Value的类型 class ARG_VALUE >//Value参数类型 class CMap : public CObject 2.3 初始化Hashtable CMap::InitHashTable - 设置长度 CMap::GetHashTableSize - 获取长度 CMap默认长度17. 2.4 数据的添加 CMap::SetAt CMap::operator[] 2.5 数据的查找 CMap::Lookup CMap::operator[] 2.6 数据的遍历 CMap::GetStartPosition - 获取起始位置 CMap::GetNextAssoc - 获取本POS的 数据以及下一个节点POS 2.7 数据节点 在CMap中,使用CAssoc构造HashTable以 及在节点中保存KEY和VALUE struct CAssoc { CAssoc* pNext;//下一个节点 UINT nHashValue;//提高遍历效率 KEY key;//KEY的值 VALUE value; //VALUE的数据 }; 2.8 数据的删除 CMap::RemoveKey - 删除指定的KEY CMap::RemoveAll - 删除所有的数据 2.9 数据数量的获取 CMap::GetCount - 获取数量 CMap::IsEmpty - 判断是否为空 2.10 关于内存管理 如果使用的new的数据,在删除时要 自己删除.CMap不会提供删除. CMap<int, int, CAnimal *, CAnimal *> mapIntToAnimal 二 MFC的文件 1 MFC的文件相关 CFile - 父类是CObject, 封装了文件 基本操作. CFileFind - 父类是CObject,封装了 文件的搜索等操作. 2 CFile文件的使用 2.1 文件的创建或打开 virtual BOOL Open( LPCTSTR lpszFileName, //文件名及路径 UINT nOpenFlags, //打开或创建方式 CFileException* pError = NULL ); 创建或打开成功返回TRUE. 2.2 文件的关闭 CFile::Close() 2.3 数据的读写 virtual void Write( const void* lpBuf, UINT nCount ); throw( CFileException ); virtual UINT Read( void* lpBuf, UINT nCount ); throw( CFileException ); 当读写数据产生错误时,会抛出异常. 2.4 文件指针 Seek - 文件指针到指定的位置 SeekToBegin - 文件指针到文件头 SeekToEnd - 文件指针到文件尾 2.5 Flush函数 强制将文件缓冲区的数据写入文件. 2.6 其他函数 文件长度 GetLength/SetLength 状态信息 GetStatus/SetStatus 3 CFileFind 的使用 3.1 查找 CFileFind::FindFile 3.2 获取同时查找下一个 CFileFind::FindNextFile 3.3 关闭 CFileFind::Close 3.4 其他 获取信息 判断类型 三 MFC序列化 1 MFC序列化 采用数据流的方式对数据、对象进行 存储或读取. 2 CArchive类 2.1 CArchive类 提供了一种数据缓冲机制,用于数据 或对象的读取和存储。 2.2 数据的读取"<<"和">>" 将数据保存数据缓冲或者从数据缓冲 读取数据。 2.3 数据缓冲,CArchive类内部的 数据 CArchive使用三个指针维护一个数据 缓冲内存: BYTE* m_lpBufCur - 当前地址 BYTE* m_lpBufMax - 缓冲区最大地址 BYTE* m_lpBufStart - 缓冲区起始地址 |<---------------------->| m_lpBufStart | m_lpBufMax m_lpBufCur 2.3.1 当写入数据时,剩余空间是否 满足需求 m_lpBufCur + 需要的空间 > m_lpBufMax 2.3.2 如果满足需求,执行2.3.4 2.3.3 如果不满足需求,它会调用Flush 函数保存数据到文件,并且将m_lpBufCur 指针设置到起始位置(m_lpBufStart) 2.3.4 将数据保存到m_lpBufStart的 地址。 2.3.5 将m_lpBufStart的地址向后偏移 需要保存的数据长度。 3 CArchive类的使用 3.1 打开文件 3.2 定义CArchive类 3.3 数据读写 3.4 关闭CArchive类 3.5 关闭文件